# -*- coding: utf-8 -*-

from PyQt4 import Qt, QtCore, QtGui

# класс, от которого нужно наследовать сложные диалоги
# тогда при его использовании нужно просто перегрузить метод defaultValue,
# и можно будет создать диалог, и вызвать его метод showAndDo вместо exec
class FormEdit(QtGui.QDialog):

    def getData(self):
        return self.__data
    
    def setData(self, value):
        if value is None:
            self.__isNew = True
            self.__data = self.defaultValue()
        else:
            self.__isNew = False
            self.__data = value
        self.fromDataToScreen()
        
    data = property(getData, setData, doc="Data for editing")

    @property
    def isNew(self):
        def fget(self):
            return self.__isNew
        def fset(self, value):
            self.__isNew = value


    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)

    # Замена методу exec.
    # Показывает окно, пока действие не будет удачным или пользователь не нажмет отмену.
    # Удобно, если действие может быть некорректным, и в таком случае пользователь должен испраить введенные данные. 
    def showAndDo(self, action, message=None):
        while True:
            if not self.exec_():
                return False
            try:
                action()
                return True
            except (AssertionError), e:
                QtGui.QMessageBox.critical(None, u"Ошибка", u"%s %s" % (unicode(e), message))

    # чисто для напоминания, что в наследнике надо перегрузить
    def defaultValue(self):
        pass

    def fromScreenToData(self):
        pass

    def fromDataToScreen(self):
        pass

